// Enum type with data and behavior - Pages 149-150
package org.effectivejava.examples.chapter06.item30;

/**
 * 带参数的枚举类：
 * 给枚举类添加方法和域（字段），增强枚举的功能。
 * 每个常亮都关联了不同的数据（常量带参数）
 * 1、注意枚举类的构造方法有两个参数，对应了枚举常量的参数；
 * 2、类似普通了实体类，但是没有set方法，只有类似get方法
 */
public enum Planet {
	MERCURY(3.302e+23, 2.439e6),
	VENUS(4.869e+24, 6.052e6),
	EARTH(5.975e+24, 6.378e6),
	MARS(6.419e+23, 3.393e6),
	JUPITER(1.899e+27, 7.149e7),
	SATURN(5.685e+26, 6.027e7),
	URANUS(8.683e+25, 2.556e7),
	NEPTUNE(1.024e+26, 2.477e7);

	private final double mass; // In kilograms(质量，单位KG)
	private final double radius; // In meters(半径，单位米)
	private final double surfaceGravity; // In m / s^2 (重力，单位m/s ^2)

	// Universal gravitational constant in m^3 / kg s^2（万有引力常数）
	private static final double G = 6.67300E-11;

	// Constructor（构造方法）
	Planet(double mass, double radius) {
		this.mass = mass;
		this.radius = radius;
		// 计算行星的重力
		surfaceGravity = G * mass / (radius * radius);
	}

	public double mass() {
		return mass;
	}

	public double radius() {
		return radius;
	}

	// 获取行星的重力
	public double surfaceGravity() {
		return surfaceGravity;
	}

	// 获取行星的质量
	public double surfaceWeight(double mass) {
		return mass * surfaceGravity; // F = ma
	}
}
